package im.agents.monitor;

import im.agents.INodeMonitor;
import im.domain.MonitorData;
import im.domain.SLA;
import im.domain.XMLSerializer;
import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.TickerBehaviour;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;


/**
 * 
 * Manda proattivamente al SLAChecker passato al costruttore i dati relativi allo SLA di interesse.
 * I dati vengono mandati al tick <tt>t</tt> solo se ve ne sono di nuovi rispetto 
 * al tick <tt>t-1</tt>, per minimizzare lo scambio di messaggi. 
 *
 */
public class SendMonitorDataOnTick extends TickerBehaviour {

	private AID sc;
	private SLA sla;
	private MonitorData latest;
	private int lastHash=0;
	public SendMonitorDataOnTick(Agent a, long period, AID sc,SLA sla) {
		super(a, period);
		this.sc= sc;
		this.sla=sla;
	}

	@Override
	public void onTick() {
		//System.out.println("tick");
		//MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.QUERY_REF);
		
		
		
		//if(!getMyAgent().isBeingMonitored(sla)){getMyAgent().removeBehaviour(this);return;}

		//se i dati inviati allo scorso tick sono uguali a quelli attuali, non inviare niente
		if(latest!=null
				&&lastHash==(getMonitorData(sla.toString()).hashCode() )
				){
			//System.out.println("sono uguali ...");
			return;
		}
		
		//se sono cambiati, invia dati attuali 
		ACLMessage reply = new ACLMessage(ACLMessage.INFORM);		
		reply.setConversationId(sla.toString());
		reply.addReceiver(sc);
		latest  = getMonitorData(sla.toString());
		lastHash=latest.hashCode();
		
		reply.setContent(XMLSerializer.doSerialize(latest));
		myAgent.send(reply);
		
	}

	protected MonitorData getMonitorData(String slaId){
		if(!getMyAgent().getMonitorData().containsKey(slaId))return null;
		
		MonitorData m = getMyAgent().getMonitorData().get(slaId);
		return m;
	}
	

	private INodeMonitor getMyAgent(){
		return (INodeMonitor)myAgent;
	}
}
